区块链第一版:基本原型

本章源代码地址:[https://github.com/daleboy/blockchain1]

undefined文件一:block.go

在区块链中,存储有效信息的是区块。比如,比特币区块存储的有效信息,就是比特币交易信息,交易信息也是所有加密货币的本质。除此以外,区块还包含了一些技术信息,比如版本,当前时间戳和前一个区块的哈希。这里我们只存储关键的技术信息:时间戳、前一个区块的哈希,本区块的哈希。

区块链第一版:基本原型 - 图1

本区块的哈希是将区块的所有数据(不包括自身的哈希数据)转为二进制连接起来后,通过哈希运算计算出来。

区块链第一版:基本原型 - 图2

这里,有几个go语言点注意:

(1)变量简要创建方法

省略var,直接创建变量并赋值,在变量后面跟冒号和等号完成:

timestamp:=[]byte(strconv.FormatInt(b.Timestamp, 10))

strconv.FormatInt函数:用于将整型数据转换成指定进制并以字符串的形式返回,其原型是:

unc FormatInt(i int64, base int) string

(2)类型转换

这里是将时间戳整数转为10进制并以字符串的形式返回。

整形不能直接强制转换为二进制,而字符串可以。所以这里用strconv包进行转换。

strconv包功能强大,可以实现几乎我们所需要的任何数据类型转换。

注意,SetHash是对Block类型定义的一个方法,通过引用调用,因为需要改变实例本身。

接下来,我们需要创建区块。

区块链第一版:基本原型 - 图3

注意,Block结构的实例化方法:

区块链第一版:基本原型 - 图4

我们是直接使用var的方式构建Block,实际上也可以用new来创建结构体的实例。

接下来需要一个函数,创建创始区块:

区块链第一版:基本原型 - 图5

undefined文件二:blockchain.go

接下来是区块链的定义与创建

区块链第一版:基本原型 - 图6

这里比较简单,只需要注意,我们无论是创建有创始区块的区块链还是给区块链添加一个区块,均需要返回区块链的指针,以供调用者继续使用。

undefined文件三:main.go

在此执行文件中,完成检验

区块链第一版:基本原型 - 图7

要注意,一个文件夹下的所有文件必须使用同一个包名。

运行结果:

区块链第一版:基本原型 - 图8